/**
 * 剪贴板辅助工具
 * 提供剪贴板读写和快递单号提取功能
 */

class ClipboardHelper {
  /**
   * 读取剪贴板内容
   * @returns {Promise<string>} 剪贴板文本内容
   */
  static async readClipboard() {
    return new Promise((resolve, reject) => {
      uni.getClipboardData({
        success: (res) => {
          resolve(res.data || '');
        },
        fail: (error) => {
          console.error('读取剪贴板失败:', error);
          reject(new Error('读取剪贴板失败'));
        }
      });
    });
  }

  /**
   * 写入剪贴板
   * @param {string} text - 要写入的文本
   * @returns {Promise<void>}
   */
  static async writeClipboard(text) {
    return new Promise((resolve, reject) => {
      uni.setClipboardData({
        data: text,
        success: () => {
          resolve();
        },
        fail: (error) => {
          console.error('写入剪贴板失败:', error);
          reject(new Error('写入剪贴板失败'));
        }
      });
    });
  }

  /**
   * 检查剪贴板权限
   * @returns {Promise<boolean>} 是否有权限
   */
  static async checkPermission() {
    try {
      // 尝试读取剪贴板来检查权限
      await this.readClipboard();
      return true;
    } catch (error) {
      return false;
    }
  }

  /**
   * 请求剪贴板权限
   * @returns {Promise<boolean>} 是否授权成功
   */
  static async requestPermission() {
    // uni-app的剪贴板API不需要显式请求权限
    // 直接尝试读取即可
    return await this.checkPermission();
  }

  /**
   * 从文本中提取快递单号
   * @param {string} text - 文本内容
   * @returns {string|null} 快递单号，如果未找到返回null
   */
  static extractTrackingNumber(text) {
    if (!text || typeof text !== 'string') {
      return null;
    }

    // 快递单号通常是10-20位的数字或字母数字组合
    // 常见格式：
    // 1. 纯数字：12位、13位、15位等
    // 2. 字母+数字：SF1234567890、YT1234567890等
    // 3. 数字+字母+数字：123456789012A等

    const patterns = [
      // 顺丰：12位数字或SF开头+12位数字
      /SF\d{12}/i,
      /\b\d{12}\b/,
      
      // 中通、圆通、申通、韵达：13位数字
      /\b\d{13}\b/,
      
      // EMS：13位字母数字组合
      /[A-Z]{2}\d{9}[A-Z]{2}/,
      
      // 京东：15位数字
      /\b\d{15}\b/,
      
      // 通用：10-20位数字或字母数字组合
      /\b[A-Z0-9]{10,20}\b/i
    ];

    for (const pattern of patterns) {
      const match = text.match(pattern);
      if (match) {
        return match[0];
      }
    }

    return null;
  }

  /**
   * 从文本中提取所有可能的快递单号
   * @param {string} text - 文本内容
   * @returns {Array<string>} 快递单号数组
   */
  static extractAllTrackingNumbers(text) {
    if (!text || typeof text !== 'string') {
      return [];
    }

    const numbers = [];
    const patterns = [
      /SF\d{12}/gi,
      /\b\d{12,15}\b/g,
      /[A-Z]{2}\d{9}[A-Z]{2}/g,
      /\b[A-Z0-9]{10,20}\b/gi
    ];

    for (const pattern of patterns) {
      const matches = text.matchAll(pattern);
      for (const match of matches) {
        const number = match[0];
        if (!numbers.includes(number)) {
          numbers.push(number);
        }
      }
    }

    return numbers;
  }

  /**
   * 智能识别剪贴板内容
   * @returns {Promise<Object>} 识别结果 { hasTrackingNumber, trackingNumber, text }
   */
  static async smartDetect() {
    try {
      const text = await this.readClipboard();
      const trackingNumber = this.extractTrackingNumber(text);

      return {
        hasTrackingNumber: !!trackingNumber,
        trackingNumber: trackingNumber,
        text: text
      };
    } catch (error) {
      console.error('智能识别失败:', error);
      return {
        hasTrackingNumber: false,
        trackingNumber: null,
        text: ''
      };
    }
  }
}

export default ClipboardHelper;
